function Spinner(){
	
	
}


/**<p>
 * Ao usar esse metodo você devera criar uma  variavel  json e colocar as opçoes disponiveis do Spinner 
 * e em seguida passar os atributos que é o seletor e o json que você criou para chamar as opções desejadas.</p>
 * <b>Exemplo:</b>
 * 
 *<p> var json ={
 *			
 *<p>			culture: "fr",</p>
 *<p>			disabled: false,</p>
 *<p>			incremental: false,</p>
 *<p>			max: 120,</p>
 *<p>			min: 0,</p>
 *<p>			numberFormat: "C",</p>
 *<p>			page: 5,</p>
 *<p>			step: 1</p>
 *<p> };
 *	
 *<p>	chamando o metodo de configurações
 *	spinner.gerarSpinner("#formulario #idade", json);
 *</p>
 * 
 * <b>Cuture:</b>
 * <p>Define a cultura de usar para analisar e formatar o valor.
 * Se nulo, a cultura atualmente definida na Globalize é usado, consulte docs globalizar para culturas disponíveis .
 * Relevante apenas se a opção numberFormat está definido. Requer Globalizemos para ser incluído .</p>
 * 
 * <b>disabled:</b>
 * <p>Desabilita o controle giratório se definido como verdadeiro .</p>
 * 
 * <b>incremental:</b>
 * <p>Controla o número de passos dados quando pressiona um botão de rotação .</p>
 * <p>Vários tipos suportados:</p>
 * <p>Booleano: Quando definido como verdadeiro , o delta do piso vai aumentar quando girou incessantemente. Quando definida como false , todas as etapas são iguais (como definido pela opção etapa).
 * Função: Recebe um parâmetro: o número de rodadas que ocorreram . Deve retornar o número de passos que devem ocorrer para a rodada atual .
 * </p>
 * <b>max:</b>
 * <p>O valor máximo permitido. Atributo máximo do elemento é usado se ele existir ea opção não estiver explicitamente definido . Se nulo , não existe máxima aplicada.</p>
 * <p>Vários tipos suportados:</p>
 * <p>Número: O valor máximo .
 * String: Se Globalize está incluído , a opção max pode ser passado como uma string que será analisado com base nas opções Numberformat e cultura ; caso contrário ele irá cair de volta para o método nativo parseFloat ().
 * </p>
 * <b>min:</b>
 * <p>O valor mínimo permitido. Min atributo do elemento é usado se ele existir ea opção não estiver explicitamente definido . Se nulo, não há valor mínimo aplicadas.</p>
 * <p>Vários tipos suportados:</p>
 * <p>Número: O valor mínimo .
 * String: Se Globalize está incluído , a opção min pode ser passado como uma string que será analisado com base nas opções Numberformat e cultura ; caso contrário ele irá cair de volta para o método nativo parseFloat ().
 *</p>
 * <b>numberFormat:</b>
 * <p>Formato de números passados ​​para Globalizar , se disponível. Os mais comuns são " n" para um número decimal e "C" para um valor de moeda .</p>
 * 
 * <b>page:</b>
 * <p>O número de passos a tomar quando a paginação através dos métodos PageUp / PageDown .</p>
 * 
 * <b>step:</b>
 * <p>O tamanho do passo a tomar quando girando através de botões ou através do STEPUP () / () stepdown métodos. Atributo do elemento passo é usado se ele existir ea opção não estiver explicitamente definido .</p>
 * <p>Vários tipos suportados:</p>
 * <p>Número : O tamanho do passo .
 * String: Se Globalize está incluído , a opção passo pode ser passado como uma string que será analisado com base nas opções Numberformat e cultura , caso contrário, ele vai cair de volta para o parseFloat nativa.
 * </p>
 * @param seletor Aqui você colocara o seletor do seu campo
 * @param config Aqui você colocara o json de opçoes sua.
 */
Spinner.prototype.gerarSpinner = function(seletor,config){
	
	var auxiliar = {};
	
	if(config){
	
	//***************** cuture ********************
	if(config.cuture != undefined){
		
		auxiliar = $.extend(auxiliar,{cuture:config.cuture});
		
	}else{
		
		auxiliar = $.extend(auxiliar,{cuture:"fr"});
	}
	
	//*************** disabled ********************
	if(config.disabled != undefined){
		
		auxiliar = $.extend(auxiliar,{disabled:config.disabled});
		
	}else{
		
		auxiliar = $.extend(auxiliar,{disabled:false});
	}
	
	//*************** incremental *****************
	if(config.incremental != undefined){
		
		auxiliar = $.extend(auxiliar,{incremental:config.incremental});
		
	}else{
		
		auxiliar = $.extend(auxiliar,{incremental:false});
	}
	
	//******************** max ********************
	if(config.max != undefined){
		
		auxiliar = $.extend(auxiliar,{max:config.max});
	}else{
		
		auxiliar = $.extend(auxiliar,{max:1000});
	}
	
	//******************** min ********************
	if(config.min != undefined){
		
		auxiliar = $.extend(auxiliar,{min:config.min});
	}else{
		
		auxiliar = $.extend(auxiliar,{min:-1000});
	}
	
	//*************** numberFormat *****************
	if(config.numberFormat != undefined){
		
		auxiliar = $.extend(auxiliar,{numberFormat:config.numberFormat});
	}else{
		
		auxiliar = $.extend(auxiliar,{numberFormat:"C"});
	}
	
	//******************** page ********************
	if(config.page != undefined){
		
		auxiliar = $.extend(auxiliar,{page:config.page});
	}else{
		auxiliar = $.extend(auxiliar,{page:5});
	}
	
	//******************** step ********************
	if(config.step != undefined){
		
		auxiliar = $.extend(auxiliar,{step:config.step});
	}else{
		
		auxiliar = $.extend(auxiliar,{step:1});
	}
	
	$(seletor).spinner(auxiliar);
	
	}
	// Caso ele não passe nada aqui será o default *******
	else{
		
		auxiliar = $.extend(auxiliar,{cuture:"fr"}); //Define a cultura de usar para analisar e formatar o valor.
		auxiliar = $.extend(auxiliar,{disabled:false}); //Desabilita o controle giratório se definido como verdadeiro.
		auxiliar = $.extend(auxiliar,{incremental:false}); //Controla o número de passos dados quando pressiona um botão de rotação .
		//Vários tipos suportados:
			//Booleano: Quando definido como verdadeiro , o delta do piso vai aumentar quando girou incessantemente. Quando definida como false , todas as etapas são iguais (como definido pela opção etapa).
		    /*Função: Recebe um parâmetro: o número de rodadas que ocorreram .
			Deve retornar o número de passos que devem ocorrer para a rodada atual .*/
		auxiliar = $.extend(auxiliar,{max:1000}); //O valor máximo permitido. Atributo máximo do elemento é usado se ele existir ea opção não estiver explicitamente definido . Se nulo , não existe máxima aplicada.
		auxiliar = $.extend(auxiliar,{min:-1000}); //O valor mínimo permitido. Min atributo do elemento é usado se ele existir ea opção não estiver explicitamente definido . Se nulo, não há valor mínimo aplicadas.
		auxiliar = $.extend(auxiliar,{numberFormat:"C"});//Formato de números passados ​​para Globalizar , se disponível. Os mais comuns são " n" para um número decimal e "C" para um valor de moeda . Veja também a opção de cultura.
		auxiliar = $.extend(auxiliar,{page:5}); //O número de passos a tomar quando a paginação através dos métodos PageUp / PageDown .
		auxiliar = $.extend(auxiliar,{step:1}); //O tamanho do passo a tomar quando girando através de botões ou através do STEPUP () / () stepdown métodos. Atributo do elemento passo é usado se ele existir ea opção não estiver explicitamente definido .
		
	
		$(seletor).spinner(auxiliar);

	}
	
};


//************************** Metodos *******************************

//Destroy   Remove a funcionalidade giratório completamente . Isto irá devolver o elemento de volta ao seu estado pré -init .
/**
 * Remove a funcionalidade giratório completamente . Isto irá devolver o elemento de volta ao seu estado pré -init .
 */
Spinner.prototype.destroySpinner = function(seletor){
	
	$(seletor).spinner("destroy");
};

//desabilitar   
/**
 * Desabilita o controle giratório .
 */
Spinner.prototype.desabilitarSpinner = function(seletor){
	
	$(seletor).spinner("disable");
};

//enable  
/**
 * Permite o controle giratório .
 */
Spinner.prototype.enableSpinner = function(seletor){
	
	$(seletor).spinner("enable");
};

//desabilitar
/**
 * 
 */
Spinner.prototype.desabilitar = function(seletor, spinner) {

	if (tabs == 0 || spinner) {

		if (typeof spinner == 'string' || typeof spinner == 'number') {

			$(seletor).spinner("disable", spinner);

		}

		if (typeof spinner == 'object') {

			$(seletor).tabs("option", "disabled", spinner);

		}

	} else {

		$(seletor).spinner("disable");

	}

};

//instance
/**
 * Recupera instância do objeto do girador . Se o elemento não tem um exemplo associado , indefinido é devolvido .
 * Ao contrário de outros métodos de widget, instância ( ) é seguro para chamar em qualquer elemento após o plugin girador foi carregado.
 */ 
Spinner.prototype.instanceSpinner = function(seletor){
	
	$(seletor).spinner("instance");
};

//pageDown  
/**
 * Diminui o valor ao número especificado de páginas , como definido pela opção principal. Sem o parâmetro , uma única página é diminuída .
 * Se o valor resultante for superior ao máximo , abaixo do min , ou resulta em uma incompatibilidade passo , o valor será ajustado para o valor válido mais próximo .
 */
Spinner.prototype.pageDownSpinner = function(seletor){
	
	$(seletor).spinner("pageDown");
};

//pageUp 
/**
 * Incrementa o valor ao número especificado de páginas , como definido pela opção principal. Sem o parâmetro , uma página única é incrementado .
 * Se o valor resultante for superior ao máximo , abaixo do min , ou resulta em uma incompatibilidade passo , o valor será ajustado para o valor válido mais próximo .
 */
Spinner.prototype.pageUpSpinner = function(seletor,number){
	
	$(seletor).spinner("pageUp", number);
};

//StepDown 
/**
 * Diminui o valor ao número especificado de passos . Sem o parâmetro , de um único passo é decrementado .
 * Se o valor resultante for superior ao máximo , abaixo do min , ou resulta em uma incompatibilidade passo , o valor será ajustado para o valor válido mais próximo .
 */
Spinner.prototype.stepDownSpinner = function(seletor){
	
	$(seletor).spinner("stepDown");
};

//stepUp 
/**
 * Incrementa o valor ao número especificado de passos . Sem o parâmetro , de um único passo é incrementado .
 * Se o valor resultante for superior ao máximo , abaixo do min , ou resulta em uma incompatibilidade passo , o valor será ajustado para o valor válido mais próximo .
 */
Spinner.prototype.stepUpSpinner = function(seletor,number){
	
	$(seletor).spinner( "stepUp", number );
};

//value 
/**
 * O valor a ser definido . Se aprovada como uma string, o valor é analisado com base nas opções Numberformat e cultura .
 */
Spinner.prototype.valueSpinner = function(seletor,number){
	
	$(seletor).spinner( "value", number );
};

//Evento spinstop
/**
 * Funcão que chama o evento spinstop quando troca o valor do girator
 */
Spinner.prototype.valorDoSpinnerSpinsop = function(seletor){
	
$(seletor).on("spinstop", function(){
	
	   alert($(this).spinner('value'));
});

};

//Evento onClick
/**
 * Toda vez ao ser clicado o spinner  ele disparar o evento onClick
 */
Spinner.prototype.eventoClick = function(seletor){
$(seletor).on('click', function() {
	
    alert($(this).spinner('value'));
});
};

//Evento Blur
/**
 * Ao perder o foco do campo ele irá verificar sé é vazio ou não.
 */
Spinner.prototype.eventoblurCampoNulo = function(seletor){
	
	$(seletor).on('blur', function() {
		
		if($.trim($(this).val()) == ''){
			
				alert($(this).spinner('value'));
		}		
	});
};

//Evento blur 
/**
 * Evento blur que ao perder o foco ele verifica se o usuario
digito o numero maximo correto que quer e minimo também
 */
Spinner.prototype.tamanhoAtingido = function(seletor,max,min){
	
	$(seletor).on('blur', function() {
	
		if($.trim($(this).val()) > max || $.trim($(this).val()) < min){
			
			
			alert("Valor do campo invalido");
		}	
	});
};

//Evento keypress e blur
/**
 * Evento keypress e blur que chamara a função que validara o campo do spinner se esta vazio e se digitou numero
 */
Spinner.prototype.validacaoCampoSpinner = function(seletor){
	
	//evento Keypress para não deixaro usuario digitar String
	$(seletor).on('keypress', function(evento){

		spinner.campoNumericoApenas(seletor, evento);
		
	});
	
	//evento blur
	$(seletor).on('blur', function() {
		
		//Ao perder o foco do campo ele irá verificar sé é vazio ou não.
		if($.trim($(this).val()) == ''){
			
			
			alert(" Não é possivel deixar vazio o campo.");
		
		}
		
		if(isNaN($.trim($(this).val()))){

			var numero = parseInt($.trim($(this).val()));
			
			alert($.trim($(this).val()) + '  não é um numero valido');
		}
		
		if(typeof numero == 'string'){
			
				alert('Digite um numero valido');
		}

	});
};


/**
 * função que permite só numeros se digitar além disso o evento é parado.
 */
Spinner.prototype.campoNumericoApenas = function(campo, evento){
	
	var tecla = evento.keyCode || evento.which;
	
	if(tecla !=8){
		
		if(tecla < 48 || tecla > 57){
			
			
			evento.preventDefault();
		}
	
	}
	
};


var spinner = new Spinner();